home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Entertainment / Tetris Light src / env.c < prev    next >
Text File  |  1993-08-05  |  5KB  |  170 lines

  1. /**********************************************************************\
  2.  
  3. File:        env.c
  4.  
  5. Purpose:    This module provides routines to determine the facilities
  6.             available on the running machine. These routines provide
  7.             glue to work on all Macintoshes (including the original
  8.             128K Mac). The implementation does not rely on any 
  9.             compiler supplied glues.
  10.             
  11.  
  12. ``Tetris Light'' - a simple implementation of a Tetris game.
  13. Copyright (C) 1993 Hoylen Sue
  14.  
  15. This program is free software; you can redistribute it and/or modify
  16. it under the terms of the GNU General Public License as published by
  17. the Free Software Foundation; either version 2 of the License, or
  18. (at your option) any later version.
  19.  
  20. This program is distributed in the hope that it will be useful,
  21. but WITHOUT ANY WARRANTY; without even the implied warranty of
  22. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  23. GNU General Public License for more details.
  24.  
  25. You should have received a copy of the GNU General Public License
  26. along with this program; see the file COPYING.  If not, write to the
  27. Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  28.  
  29. \**********************************************************************/
  30.  
  31. #include "local.h"
  32.  
  33. #include <GestaltEqu.h>
  34. #include <Traps.h>
  35.  
  36. #include "env.h"
  37.  
  38. /*--------------------------------------------------------------------*/
  39.  
  40. /* Local globals - initialized to worst case assumption, but will be
  41.    set up correctly to reflect the machine when `env_init' is called. */
  42.  
  43. static Boolean env_64k_rom = TRUE;
  44. static Boolean env_gestalt_available = FALSE;
  45.  
  46. /*--------------------------------------------------------------------*/
  47.  
  48. static void env_init(void)
  49. /* Set up local globals which indicate whether the machine has 64K ROMs
  50.    and if gestalt is available.  The routines which need this information
  51.    must call this routine before accessing that information.  Calculation
  52.    of these variables is done only once, but this approach simplifies the
  53.    interface to this module, because it requries no explicit
  54.    initialization.  Failure to call this module may result in those
  55.    variables containing default values, which will indicate a very
  56.    limited machine. */
  57. {
  58.     static Boolean initialized = FALSE;
  59.     INTEGER rom_version;
  60.     INTEGER machine;
  61.     
  62.     if (initialized)
  63.         return;
  64.     initialized = TRUE;
  65.     
  66.     /* Check for 64K ROMS. Use Environs since it is available in ALL
  67.        Macintoshes, although it has been replaced by Gestalt. Note that
  68.        this code does not rely on any compiler glues. */
  69.     
  70.     Environs(&rom_version, &machine);
  71.     if (rom_version >= 0x75)
  72.         env_64k_rom = FALSE;
  73.     
  74.     /* Check for Gestalt facility. Gestalt is never available on
  75.        original 64K ROM machines! */
  76.     
  77.     if (env_64k_rom)
  78.         env_gestalt_available = FALSE;
  79.     else
  80.         env_gestalt_available = env_trap_available(0xA1AD);
  81. }
  82.  
  83. /*--------------------------------------------------------------------*/
  84.  
  85. static INTEGER num_toolbox_traps(void)
  86. /* Returns the size of the toolbox trap dispatch table.  Code from
  87.    Inside Macintosh VI p. 3-8.  InitGraf (0xA86E) is always implemented.
  88.    If the trap dispatch table has more than 0x200 entries, then 0xAA6E
  89.    always points to either unimplemented or something else, but never
  90.    to InitGraf. The 64K roms do not have NGetTrapAddress, but always
  91.    have small dispatch tables.
  92.    Internal routines which call this one must have ensured that the
  93.    `env_64k_rom' variable has been set up correctly. */
  94. {
  95.     if (env_64k_rom ||
  96.         (NGetTrapAddress(_InitGraf, ToolTrap) ==
  97.          NGetTrapAddress(0xAA6E, ToolTrap)))
  98.         return 0x0200;
  99.     else
  100.         return 0x0400;
  101. }
  102.  
  103. Boolean env_trap_available(INTEGER the_trap)
  104. /* Returns TRUE if the given trap is available. Based on code from
  105.    Inside Macintosh VI.  This routine does not rely on any glue, and
  106.    will work on all Macintoshes from the original 128K mac upwards.
  107.    Short circuit calls to this routine by checking for 64K roms first. */
  108. {
  109.     register TrapType tType;
  110.  
  111.     env_init();
  112.     
  113.     if (the_trap & 0x0800) {
  114.         tType = ToolTrap;
  115.         the_trap &= 0x07FF;
  116.         if (the_trap >= num_toolbox_traps())
  117.             the_trap = _Unimplemented;
  118.     }
  119.     else
  120.         tType = OSTrap;
  121.     
  122.     if (env_64k_rom)
  123.         return (GetTrapAddress(the_trap) !=
  124.                 GetTrapAddress(_Unimplemented));
  125.     else
  126.         return (NGetTrapAddress(the_trap, tType) != 
  127.                 NGetTrapAddress(_Unimplemented, ToolTrap));
  128. }
  129.  
  130. /*--------------------------------------------------------------------*/
  131.  
  132. Boolean env_WaitNextEvent_available(void)
  133. /* Determines if `WaitNextEvent' trap is available.  Returns TRUE if it
  134.    is, FALSE if it is not available. */
  135. {
  136.     return env_trap_available(_WaitNextEvent);
  137. }
  138.  
  139. /*--------------------------------------------------------------------*/
  140.  
  141. Boolean env_FindFolder_available(void)
  142. /* Determines if the `Gestalt' trap is available.  Returns TRUE if it
  143.    is, FALSE if it is not available. */
  144. {    
  145.     env_init();
  146.  
  147.     if (env_gestalt_available) {
  148.         LONGINT result;
  149.         
  150.         Gestalt(gestaltFindFolderAttr, &result);
  151.         if (result & (0x0001 << gestaltFindFolderPresent))
  152.             return TRUE;
  153.     }
  154.  
  155.     return FALSE;
  156. }
  157.  
  158. /*--------------------------------------------------------------------*/
  159.  
  160. Boolean env_SndPlay_available(void)
  161. /* Determines if 'SndPlay' is available.  Returns TRUE if it is, FALSE
  162.    if it is not. */
  163. {
  164.     env_init();
  165.     
  166.     return env_trap_available(_SndPlay);
  167. }
  168.  
  169. /*--------------------------------------------------------------------*/
  170.